{- misc utility functions
-
- - Copyright 2010-2011 Joey Hess <id@joeyh.name>
+ - Copyright 2010-2025 Joey Hess <id@joeyh.name>
-
- License: BSD-2-clause
-}
firstLine',
fileLines,
fileLines',
+ linesFile,
+ linesFile',
segment,
segmentDelim,
massReplace,
fileLines' = S8.lines
#endif
+-- One windows, writeFile does NewlineMode translation,
+-- adding CR before LF. When converting to ByteString, use this to emulate that.
+linesFile :: L.ByteString -> L.ByteString
+#ifndef mingw32_HOST_OS
+linesFile = id
+#else
+linesFile = L8.concat . concatMap (\x -> [x, L8.pack "\r\n"]) . fileLines
+#endif
+
+linesFile' :: S.ByteString -> S.ByteString
+#ifndef mingw32_HOST_OS
+linesFile' = id
+#else
+linesFile' = S8.concat . concatMap (\x -> [x, S8.pack "\r\n"]) . fileLines'
+#endif
+
{- Splits a list into segments that are delimited by items matching
- a predicate. (The delimiters are not included in the segments.)
- Segments may be empty. -}
writeSshConfig :: OsPath -> String -> IO ()
writeSshConfig f s = do
- F.writeFile' f (encodeBS s)
+ F.writeFile' f (linesFile' (encodeBS s))
setSshConfigMode (fromOsPath f)
{- Ensure that the ssh config file lacks any group or other write bits,